/********SYS基础定义*********/
//文件名：sys.C
//时间：2021/12/12
//作者：吴东桓
//晶振：11.0954mhz
//STC12C
/**************************延时部分*****************************/
#include "sys.h"
 u8 flag_uart = 0;
 u8 i = 0;
// char temp1;
 char ReciveData[17] = "\0";		//用于储存接收数据
 
void delay_ms(u16 ms)
{                         
	u16 a;
	while(ms)
	{
		a=1800;
		while(a--);
		ms--;
	}
	return;
}

void Delay1us()		//@11.0592MHz
{
	_nop_();
}
void Delay10us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	_nop_();
	i = 24;
	while (--i);
}
void Delay100us()		//@11.0592MHz
{
	unsigned char i, j;

	i = 2;
	j = 15;
	do
	{
		while (--j);
	} while (--i);
}
void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}
void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 108;
	j = 144;
	do
	{
		while (--j);
	} while (--i);
}
void Delay100ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 5;
	j = 52;
	k = 195;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

/**************************串口部分*****************************/

void UART_init(void)	//串口初始化 9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x04;		//定时器时钟1T模式
	BRT = 0xDC;		//设置定时重载值
	AUXR |= 0x01;		//串口1使用独立波特率发射器为波特率发生器
	AUXR |= 0x10;		//启动独立波特率发射器
	ES = 1; 			//关键：开启了中断就必须编写相应的中断函数，哪怕是中断空函数，
				   		//但必须有,否则程序进入中断入口地址后（这里是 0023H)不能跳出，必然出错
	EA = 1;
}



//**********************************************
//串口发送
void UARTSend(char UCHAR)
{
  SBUF=UCHAR;
 while(TI==0);
 TI=0;
}


////**********************************************
void UART_PutString(u8 *buf )//串口发送字符串
{
	while(*buf != '\0')
	{
		SBUF = *buf;							//发送第一个字符
		while(!TI);							//串口数据发送完毕判断
		buf++;										//下一个字符
		TI = 0;									//发送标志位清零
	}

} 
//**********************************************
void UARTRead(void) interrupt 4
{

 if (RI)//判断接收标志位
	{
//		static u8 i = 0;
		u8 receive;			//定义接收数据缓冲区
		RI = 0;				//接收标志位清零
		receive = SBUF;				//保存接收到的一个字节值到缓冲区receive
		ReciveData[i] = receive;			//如果是第一个值，将缓冲区的值拷贝到ReciveData[0]，不是第一个值则拷贝到ReciveData[i]
		if (ReciveData[0] == '$')				//单片机接收协议，只接收数据头带有$的字符串。如发送Hello和$Hello，只接收$Hello。并保存字节头$
		{	
			if(i<sizeof(ReciveData))
			i++;
			if (ReciveData[i-1] == '\n')					//单片机接收数据结束标志'\n'，默认数据结束标志为\r\n，也就是换行回车符
			{
				ReciveData[i-2] = '\0';						//单片机接收数据不保存结束标志，如$Hello\r\n，则接收到的数据为$Hello
				i = 0;														//当数据接收完毕后，清零计数器，准备下一次的计数
			}
		}
		else									//如果接收到的数据不带数据头，则可能是数据损坏或错误的值，计数器清零，准备重新接收
		{
			ReciveData[0] = '\0';
			i = 0;				//如果不服从单片机接收协议，则重新赋值
		}
	}
}


